home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / assembly / mouse^shift.lha / MouseShift.asm < prev    next >
Encoding:
Assembly Source File  |  1990-09-13  |  5.0 KB  |  300 lines

  1.     OPT    A+,O+,OW-        ;enable optimizing
  2.  
  3. ;------------------ MouseShift.asm   ©1992 Garrick Meeker ---------------
  4. ;
  5. ; Installs an input handler that converts a middle mouse button press to
  6. ; a left shift key press.
  7. ;
  8. ; Version 2.0 - This program now installs a commodity under V37.
  9. ;-----------------------------------------------------------------------
  10.  
  11.     include    "exec/types.i"
  12.     include    "dos/dos.i"
  13.     include    "exec/exec_lib.i"
  14.     include    "exec/memory.i"
  15.     include    "exec/io.i"
  16.     include    "devices/input.i"
  17.     include    "devices/inputevent.i"
  18.     include    "libraries/commodities.i"
  19.     include    "misc/easystart.i"
  20.  
  21.     XREF    _CreatePort
  22.     XREF    _CreateExtIO
  23.     XREF    _DeletePort
  24.     XREF    _DeleteExtIO
  25.  
  26.     XDEF    _SysBase
  27.  
  28. CALLCX    MACRO
  29.     XREF    _LVO\1
  30.     move.l    _CxBase,a6
  31.     jsr    _LVO\1(a6)
  32.     ENDM
  33.  
  34.     moveq    #0,d5
  35.  
  36.     move.l    4.W,a6
  37.     cmp.w    #37,LIB_VERSION(a6)
  38.     bcc    Release2_Code
  39.  
  40.     move.l    #0,-(sp)
  41.     move.l    #0,-(sp)
  42.     jsr    _CreatePort
  43.     addq.l    #8,sp
  44.     move.l    d0,d2
  45.     beq    exit
  46.  
  47.     move.l    #IS_SIZE,d0
  48.     move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  49.     CALLEXEC AllocMem
  50.     move.l    d0,d3
  51.     beq    quit4
  52.  
  53.     move.l    #IOSTD_SIZE,-(sp)
  54.     move.l    d2,-(sp)
  55.     jsr    _CreateExtIO
  56.     addq.l    #8,sp
  57.     move.l    d0,d4
  58.     beq    quit3
  59.  
  60.     lea    devname,a0        ;name
  61.     moveq    #0,d0            ;unit
  62.     move.l    d4,a1            ;iORequest
  63.     moveq    #0,d1            ;flags
  64.     CALLEXEC OpenDevice
  65.     tst.l    d0
  66.     bne    quit2
  67.  
  68.     move.l    #_HandlerSize,d0
  69.     move.l    #MEMF_PUBLIC,d1
  70.     CALLEXEC AllocMem
  71.     move.l    d0,d5
  72.     beq    quit1
  73.  
  74.     lea    _ChangeEvent,a0
  75.     move.l    d5,a1
  76.     move.l    #_HandlerSize,d0
  77.     CALLEXEC CopyMem
  78.  
  79.     move.l    d3,a0
  80.     move.l    d4,a1
  81.  
  82.     clr.l    IS_DATA(a0)
  83.     move.l    d5,IS_CODE(a0)
  84.     move.b    #60,LN_PRI(a0)
  85.     move.l    #name,LN_NAME(a0)
  86.  
  87.     move.l    d3,IO_DATA(a1)
  88.     move.w    #IND_ADDHANDLER,IO_COMMAND(a1)
  89.  
  90. ;IO struct already in A1
  91.     CALLEXEC DoIO
  92.  
  93.     moveq    #0,d3
  94.  
  95. quit1    move.l    d4,a1
  96.     CALLEXEC CloseDevice
  97.  
  98. quit2    move.l    d4,-(sp)
  99.     jsr    _DeleteExtIO
  100.     addq.l    #4,sp
  101.  
  102. quit3    tst.l    d3            ;can't be freed if handler installed
  103.     beq    quit4
  104.     move.l    d3,a1
  105.     move.l    #IS_SIZE,d0
  106.     CALLEXEC FreeMem
  107.  
  108. quit4    move.l    d2,-(sp)
  109.     jsr    _DeletePort
  110.     addq.l    #4,sp
  111.  
  112. byebye    tst.l    d5            ;set return code
  113.     beq    exit
  114.     moveq    #0,d0
  115.     rts
  116.  
  117. exit    move.l    #20,d0
  118.     rts
  119.  
  120. devname    dc.b    'input.device',0
  121.     EVEN
  122.  
  123. *** HANDLER CODE ***
  124.  
  125. * The event list is passed in a0.
  126. * The is_Data field is passed in a1.
  127.  
  128. * On exit the event list must be returned in d0.
  129.  
  130. _ChangeEvent    move.l    a0,-(sp)
  131.  
  132. CheckLoop
  133.     bsr    change
  134.     move.l    (a0),d0
  135.     move.l    d0,a0
  136.     bne.s    CheckLoop
  137.  
  138.     move.l    (sp)+,d0
  139.     rts
  140.  
  141. CxChange
  142.     movem.l    d0-1/a0-1/a6,-(sp)
  143.     move.l    4(sp),a0
  144.     CALLCX    CxMsgData
  145.     move.l    d0,a0
  146.     bsr    change
  147.     movem.l    (sp)+,d0-1/a0-1/a6
  148.     rts
  149.  
  150. change
  151.     bclr.b    #IEQUALIFIERB_MIDBUTTON-8,ie_Qualifier(a0)
  152.     beq.s    CheckRaw
  153.     bset.b    #IEQUALIFIERB_LSHIFT,ie_Qualifier+1(a0)
  154.  
  155. CheckRaw
  156.     cmp.b    #IECLASS_RAWMOUSE,ie_Class(a0)
  157.     bne.s    NextEvent
  158.  
  159.     move.w    ie_Code(a0),d0
  160.     and.w    #~IECODE_UP_PREFIX,d0
  161.     cmp.w    #IECODE_MBUTTON,d0
  162.     bne.s    NextEvent
  163.     sub.w    #IECODE_MBUTTON-$60,ie_Code(a0)        ;left shift
  164.     move.b    #IECLASS_RAWKEY,ie_Class(a0)
  165.  
  166. NextEvent
  167.     rts
  168.  
  169. name    dc.b    'Mouse Shift',0
  170.     EVEN
  171.  
  172. _HandlerSize    equ    *-_ChangeEvent
  173.  
  174. ;--- LEFT AMIGA ---- LEFT ALT ---- LEFT SHIFT ---
  175. ;       -66-           -64-           -60-
  176. ;--- RIGHT AMIGA --- RIGHT ALT --- RIGHT SHIFT ---
  177. ;       -67-           -65-           -61-
  178. ;--- CTRL ---
  179. ;    -63-
  180.  
  181. Release2_Code
  182.     lea    comlib_name,a1            ;get library
  183.     moveq    #37,d0
  184.     CALLEXEC OpenLibrary
  185.     move.l    d0,_CxBase
  186.     beq    byebye
  187.  
  188.     CALLEXEC CreateMsgPort            ;get msgport
  189.     move.l    d0,msgport
  190.     beq    abort1
  191.     move.l    d0,broker_struct+nb_Port
  192.  
  193.     move.l    d0,a0                ;get port signal
  194.     move.b    MP_SIGBIT(a0),d0
  195.     move.l    #SIGBREAKF_CTRL_C,d1
  196.     bset    d0,d1
  197.     move.l    d1,signums
  198.  
  199.     lea    broker_struct,a0
  200.     moveq    #0,d0
  201.     CALLCX    CxBroker
  202.     move.l    d0,broker
  203.     beq    abort2
  204.  
  205.     moveq    #CX_CUSTOM,d0
  206.     lea    CxChange,a0
  207.     sub.l    a1,a1
  208.     CALLCX    CreateCxObj
  209.     tst.l    d0
  210.     beq    abort3
  211.     move.l    d0,a1
  212.     move.l    broker,a0
  213.     CALLCX    AttachCxObj
  214.  
  215.     move.l    broker,a0
  216.     moveq    #1,d0
  217.     CALLCX    ActivateCxObj
  218.  
  219. *** Release 2 Handler ***
  220. wait    move.l    signums,d0
  221.     CALLEXEC Wait
  222.     btst    #SIGBREAKB_CTRL_C,d0
  223.     bne    abort3            ;CTRL-C hit
  224.  
  225. ie_loop    move.l    msgport,a0
  226.     CALLEXEC GetMsg
  227.     tst.l    d0
  228.     beq    wait
  229.     move.l    d0,a2
  230.  
  231.     move.l    a2,a0
  232.     CALLCX    CxMsgType
  233.     move.l    d0,d6
  234.     move.l    a2,a0
  235.     CALLCX    CxMsgID
  236.     move.l    d0,d4
  237.  
  238.     move.l    a2,a1
  239.     CALLEXEC ReplyMsg
  240.  
  241.     cmp.l    #CXM_COMMAND,d6
  242.     bne    ie_loop
  243.     cmp.l    #CXCMD_DISABLE,d4
  244.     bne    .on
  245.     move.l    broker,a0
  246.     moveq    #0,d0
  247.     CALLCX    ActivateCxObj
  248.     bra    ie_loop
  249. .on    cmp.l    #CXCMD_ENABLE,d4
  250.     bne    .kill
  251.     move.l    broker,a0
  252.     moveq    #1,d0
  253.     CALLCX    ActivateCxObj
  254.     bra    ie_loop
  255. .kill    cmp.l    #CXCMD_KILL,d4
  256.     bne    .unique
  257.     bra    abort3            ;exit
  258. .unique    cmp.l    #CXCMD_UNIQUE,d4
  259.     bne    ie_loop
  260.  
  261. abort3    move.l    broker,a0        ;delete CxObject
  262.     CALLCX    DeleteCxObjAll
  263.  
  264. .remmsg    move.l    msgport,a0
  265.     CALLEXEC GetMsg
  266.     tst.l    d0
  267.     beq    abort2
  268.     move.l    d0,a1
  269.     CALLEXEC ReplyMsg
  270.     bra    .remmsg
  271.  
  272. abort2    move.l    msgport,a0        ;delete message port
  273.     CALLEXEC DeleteMsgPort
  274.  
  275. abort1    move.l    _CxBase,a1        ;close commodities.library
  276.     CALLEXEC CloseLibrary
  277.     bra    byebye
  278.  
  279. broker_struct
  280.     dc.b    NB_VERSION,0
  281.     dc.l    name
  282.     dc.l    CommTitle
  283.     dc.l    CommDesc
  284.     dc.w    NBU_UNIQUE!NBU_NOTIFY
  285.     dc.w    0
  286.     dc.b    60,0            ;priority
  287.     dc.l    0
  288.     dc.w    0
  289.  
  290. msgport    dc.l    0
  291. signums    dc.l    0
  292. broker    dc.l    0
  293. _CxBase    dc.l    0
  294.  
  295. comlib_name    dc.b    'commodities.library',0
  296. CommTitle    dc.b    'Mouse Shift by Garrick Meeker',0
  297. CommDesc    dc.b    'Turns middle button into a shift key',0
  298.     EVEN
  299.  
  300.